--// Metallic City (and SATRB by Extension )NPCs //--
--// By StarManiaKG and NARBluebear //--

--// Porting Over Code and Old Scripts is So Much Fun //--

--// FREESLOTS
freeslot(
-- Objects
"MT_NPC_MC",
"MT_NPC_MC_TAILS",

-- States
"S_NPC_STND",
"S_NPC_WALK",
"S_NPC_PAIN",
"S_NPC_DEAD"
);

--// OBJECTS
mobjinfo[MT_NPC_MC] = {
    doomednum = 2305,
    spawnstate = S_NPC_STND,
    spawnhealth = 1,
    seestate = S_NPC_WALK,
    painstate = S_NPC_PAIN,
    deathstate = S_NPC_DEAD,
    speed = 1,
    radius = 16*FRACUNIT,
    height = 48*FRACUNIT,
    dispoffset = 0,
    mass = 1000,
	flags = MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_NOBLOCKMAP
};

mobjinfo[MT_NPC_MC_TAILS] = { -- YOU CAN'T HAVE TAILS
	doomednum = -1,
	spawnstate = S_TAILSOVERLAY_STAND,
	spawnhealth = 1000,
	seestate = S_NULL,
	seesound = sfx_none,
	reactiontime = 8,
	attacksound = sfx_none,
	painstate = S_NULL,
	painchance = 0,
	painsound = sfx_none,
	meleestate = S_NULL,
	missilestate = S_NULL,
	deathstate = S_NULL,
	xdeathstate = S_NULL,
	deathsound = sfx_none,
	speed = 8,
	radius = 16*FRACUNIT,
	height = 48*FRACUNIT,
	dispoffset = 2,
	mass = 16,
	damage = 0,
	activesound = sfx_none,
	raisestate = S_NULL,
	flags = MF_SCENERY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_NOBLOCKMAP
};

--// STATES
states[S_NPC_STND] = {
        sprite = SPR_PLAY,
        frame = SPR2_STND,
        tics = -1
};
states[S_NPC_WALK] = {
        sprite = SPR_PLAY,
        frame = SPR2_WALK,
        tics = -1
};
states[S_NPC_PAIN] = {
        sprite = SPR_PLAY,
        frame = SPR2_PAIN,
        tics = -1
};
states[S_NPC_DEAD] = {
        sprite = SPR_PLAY,
        frame = SPR2_DEAD,
        tics = -1
};

--// HOOKS
-- Main Code --
addHook("MobjSpawn", function(mobj)
    if (mobj and mobj.valid and mobj.type == MT_NPC_MC) then
		-- Main NPCS --
		local npcskin = {[1] = "sonic", [2] = "tails", [3] = "knuckles", [4] = "amy", [5] = "fang"};

		mobj.skin = npcskin[mobj.spawnpoint and mobj.spawnpoint.extrainfo or P_RandomRange(1, #npcskin)];
		mobj.sprite2 = SPR2_STND;

		mobj.color = P_RandomRange(0, #skincolors-1);

		-- NPC FollowObject Handler --
		if (skins[mobj.skin].followitem and not mobj.followmobj) then
			mobj.followmobj = P_SpawnMobjFromMobj(mobj, mobj.x, mobj.y, mobj.z, MT_NPC_MC_TAILS);
			mobj.followmobj.angle, mobj.followmobj.rollangle, mobj.followmobj.drawangle = mobj.angle, mobj.rollangle, mobj.drawangle;

			if (VERSION == 202 and SUBVERSION < 11) then
				P_TeleportMove(mobj.followmobj, mobj.x + FixedMul(-1*FRACUNIT, cos(mobj.angle)), mobj.y + FixedMul(-1*FRACUNIT, sin(mobj.angle)), mobj.z);
			else
				P_SetOrigin(mobj.followmobj, mobj.x + FixedMul(-1*FRACUNIT, cos(mobj.angle)), mobj.y + FixedMul(-1*FRACUNIT, sin(mobj.angle)), mobj.z);
			end

			if (mobj.flags2 & MF2_OBJECTFLIP) then mobj.followmobj.flags2 = $1|MF2_OBJECTFLIP|MF2_LINKDRAW; end
			if (mobj.eflags & MFE_VERTICALFLIP) then mobj.followmobj.eflags = $1|MFE_VERTICALFLIP; mobj.followmobj.z = mobj.height - mobj.followmobj.height; end

			mobj.followmobj.scale, mobj.followmobj.destscale = mobj.scale, mobj.scale;
			mobj.followmobj.color = mobj.color;

			mobj.followmobj.skin = mobj.skin;
			mobj.followmobj.state = S_TAILSOVERLAY_STAND;
			mobj.followmobj.sprite2 = SPR2_STND;
		end
	end
end)

-- FollowObject Movement Handler --
addHook("MobjThinker", function(mobj)
	if (mobj and mobj.valid and mobj.type == MT_NPC_MC) then
		if (skins[mobj.skin].followitem and mobj.followmobj) then
			mobj.followmobj.angle, mobj.followmobj.rollangle, mobj.followmobj.drawangle = mobj.angle, mobj.rollangle, mobj.drawangle;

			if (VERSION == 202 and SUBVERSION < 11) then
				P_TeleportMove(mobj.followmobj, mobj.x + FixedMul(-1*FRACUNIT, cos(mobj.angle)), mobj.y + FixedMul(-1*FRACUNIT, sin(mobj.angle)), mobj.z);
			else
				P_MoveOrigin(mobj.followmobj, mobj.x + FixedMul(-1*FRACUNIT, cos(mobj.angle)), mobj.y + FixedMul(-1*FRACUNIT, sin(mobj.angle)), mobj.z);
			end
		end
	end
end)